package com.wuseguang.springcloud.util;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * excel工具类
 *
 * @author zmc
 * @since 2019-12-10
 */
public class ExeclUtils {

    /**
     * 下载excel模板(list<class>)
     *
     * @param response
     * @param listObject
     * @param key        列名/key
     * @param value      值
     * @param fileName   excel名称
     */
    public static void downloadExcelClassTemplate(HttpServletResponse response, List<?> listObject, String[] key, String[] value, String fileName) throws IOException {
        //获取信息
        List<Map<String, Object>> list = formatExcelData(listObject);
        //创建ByteArrayOutputStream
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //创建工作簿
        createWorkBook(list, key, value).write(os);
        //下载execl
        ExcelDownloadUtils.downloadExcel(response, os, fileName);

    }

    /**
     * 下载excel模板(list<Map<String,Object>>)
     *
     * @param response
     * @param list
     * @param key      列名/key
     * @param value    值
     * @param fileName excel名称
     */
    public static void downloadExcelMapTemplate(HttpServletResponse response, List<Map<String, Object>> list, String[] key, String[] value, String fileName) throws IOException {


        //创建ByteArrayOutputStream
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //创建工作簿
        createWorkBookTimetable(list, key, value).write(os);
        //下载execl
        ExcelDownloadUtils.downloadExcel(response, os, fileName);
    }


    /**
     * 下载excel普通模板
     *
     * @param request
     * @param response
     * @param filePath 文件路径
     * @param fileName 文件名称
     * @throws IOException
     */
    public static void downloadExcelOrdinaryTemplate(HttpServletRequest request, HttpServletResponse response, String filePath, String fileName) {

        //下载execl
        ExcelDownloadUtils.downloadExcel(request, response, filePath, fileName);
    }


    /**
     * 格式化excel的数据
     *
     * @param list 数据
     */
    public static List<Map<String, Object>> formatExcelData(List<?> list) {
        //初始化后数据
        List<Map<String, Object>> listMap = new ArrayList<>();

        Object project;
        //判断数据不为空时
        if (!list.isEmpty()) {
            //循环数据
            for (int j = 0; j < list.size(); j++) {
                //获取第i列的数据
                project = list.get(j);
                //把object的类型转为map
                Map<String, Object> mapValue = MapUtil.objectTurnMap(project);
                //把map添加到list中
                listMap.add(mapValue);
            }
        }
        //返回初始化后的数据
        return listMap;
    }

    public static Workbook createWorkBook(List<Map<String, Object>> list, String[] key, String value[]) {

        // 创建excel工作簿
        Workbook worb = new HSSFWorkbook();
        // 创建第一个sheet（页），并命名
        Sheet sheet = worb.createSheet("sheet1");
        // 手设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度。
        for (int i = 0; i < key.length; i++) {
            sheet.setColumnWidth((short) i, (short) (35 * 150));
        }

        // 创建单元格格式
        CellStyle cs = worb.createCellStyle();
        // 创建字体
        Font f = worb.createFont();

        // 创建字体样式
        f.setFontHeightInPoints((short) 12);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setFontName("宋体");

        // 设置单元格的样式
        cs.setFont(f);


        // 创建第一行
        Row row = sheet.createRow((short) 0);
        row.setHeightInPoints(20);

        Cell cell = null;


        // 设置列名
        for (int i = 0; i < key.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(key[i]);
            cell.setCellStyle(cs);
        }
        // 设置每行每列的值
        if (!list.isEmpty()) {
            for (short i = 0; i < list.size(); i++) {
                // 创建一行，在页sheet上
                Row row1 = sheet.createRow((short) (i + 1));
                row1.setHeightInPoints(20);
                // 在row行上创建一个方格
                for (short j = 0; j < value.length; j++) {
                    cell = row1.createCell(j);
                    // 判断是否为时间格式，如果为时间格式，要进行格式转换
                    String valueS = "";
                    Object bufferValue = list.get(i).get(value[j]);
                    if (bufferValue instanceof Date) {
                        //获取value
                        valueS = DateUtil.parseData((Date) bufferValue, "yyyy-MM-dd HH:mm:ss");
                    } else {
                        //获取value
                        valueS = StringUtils.isEmpty(bufferValue) ? "" : bufferValue.toString();
                    }
                    //把值放进去
                    cell.setCellValue(valueS);
                    //设置样式
                    cell.setCellStyle(cs);
                }
            }
        }
        return worb;
    }

    /**
     * 课表模板专属
     *
     * @param list
     * @param key
     * @param value
     * @return
     */
    public static Workbook createWorkBookTimetable(List<Map<String, Object>> list, String[] key, String value[]) {

        // 创建excel工作簿
        Workbook worb = new HSSFWorkbook();
        // 创建第一个sheet（页），并命名
        Sheet sheet = worb.createSheet("sheet1");
        // 手设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度。
        for (int i = 0; i < key.length; i++) {
            sheet.setColumnWidth((short) i, (short) (35 * 150));
        }

        // 创建单元格格式
        CellStyle cs = worb.createCellStyle();
        // 创建字体
        Font f = worb.createFont();

        // 创建字体样式
        f.setFontHeightInPoints((short) 12);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setFontName("宋体");

        // 设置单元格的样式
        cs.setFont(f);


        // 创建第一行
        Row row = sheet.createRow((short) 0);
        row.setHeightInPoints(20);

        Cell cell = null;



        // 创建单元格格式
        CellStyle cs2 = worb.createCellStyle();
        // 创建字体
        Font f2 = worb.createFont();

        // 创建字体样式
        f2.setFontHeightInPoints((short) 12);
        f2.setColor(IndexedColors.RED.getIndex());
        f2.setFontName("宋体");

        // 设置单元格的样式
        cs2.setFont(f2);


        // 创建第一行
        Row row2 = sheet.createRow((short) 1);
        row2.setHeightInPoints(20);

        Cell cell2 = null;


        // 设置列名
        for (int i = 0; i < key.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(key[i]);
            cell.setCellStyle(cs);

            cell2 = row2.createCell(i);
            if(i==0){
                cell2.setCellValue("样式此行不要复制");
            }else{
                cell2.setCellValue("语文/李xx");
            }
            cell2.setCellStyle(cs2);
        }
        // 设置每行每列的值
        if (!list.isEmpty()) {
            for (short i = 0; i < list.size(); i++) {
                // 创建一行，在页sheet上
                Row row1 = sheet.createRow((short) (i + 2));
                row1.setHeightInPoints(20);
                // 在row行上创建一个方格
                for (short j = 0; j < value.length; j++) {
                    cell = row1.createCell(j);
                    // 判断是否为时间格式，如果为时间格式，要进行格式转换
                    String valueS = "";
                    Object bufferValue = list.get(i).get(value[j]);
                    if (bufferValue instanceof Date) {
                        //获取value
                        valueS = DateUtil.parseData((Date) bufferValue, "yyyy-MM-dd HH:mm:ss");
                    } else {
                        //获取value
                        valueS = StringUtils.isEmpty(bufferValue) ? "" : bufferValue.toString();
                    }
                    //把值放进去
                    cell.setCellValue(valueS);
                    //设置样式
                    cell.setCellStyle(cs);
                }
            }
        }
        return worb;
    }

    /**
     * list<Map<String,object></>>
     * @param response
     * @param list
     * @param key
     * @param value
     * @param fileName
     * @throws IOException
     */
    public static void downloadExcelMapTwoTemplate(HttpServletResponse response, List<Map<String, Object>> list, String[] key, String[] value, String fileName)throws IOException {

        //创建ByteArrayOutputStream
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //创建工作簿
        createWorkBookNotLoggedIn(list, key, value).write(os);
        //下载execl
        ExcelDownloadUtils.downloadExcel(response, os, fileName);
    }


    /**
     *未登录
     * @param list
     * @param key
     * @param value
     * @return
     */
    public static Workbook createWorkBookNotLoggedIn(List<Map<String, Object>> list, String[] key, String value[]) {

        // 创建excel工作簿
        Workbook worb = new HSSFWorkbook();
        // 创建第一个sheet（页），并命名
        Sheet sheet = worb.createSheet("sheet1");
        // 手设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度。
        for (int i = 0; i < key.length; i++) {
            sheet.setColumnWidth((short) i, (short) (35 * 150));
        }

        // 创建单元格格式
        CellStyle cs = worb.createCellStyle();
        // 创建字体
        Font f = worb.createFont();

        // 创建字体样式
        f.setFontHeightInPoints((short) 12);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setFontName("宋体");

        // 设置单元格的样式
        cs.setFont(f);


        // 创建第一行
        Row row = sheet.createRow((short) 0);
        row.setHeightInPoints(20);

        Cell cell = null;



        // 创建单元格格式
        CellStyle cs2 = worb.createCellStyle();
        // 创建字体
        Font f2 = worb.createFont();

        // 创建字体样式
        f2.setFontHeightInPoints((short) 12);
        f2.setColor(IndexedColors.RED.getIndex());
        f2.setFontName("宋体");

        // 设置单元格的样式
        cs2.setFont(f2);


        // 创建第一行
        Row row2 = sheet.createRow((short) 1);
        row2.setHeightInPoints(20);

        // 设置列名
        for (int i = 0; i < key.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(key[i]);
            cell.setCellStyle(cs);

        }
        // 设置每行每列的值
        if (!list.isEmpty()) {
            for (short i = 0; i < list.size(); i++) {
                // 创建一行，在页sheet上
                Row row1 = sheet.createRow((short) (i + 1));
                row1.setHeightInPoints(20);
                // 在row行上创建一个方格
                for (short j = 0; j < value.length; j++) {
                    cell = row1.createCell(j);
                    // 判断是否为时间格式，如果为时间格式，要进行格式转换
                    String valueS = "";
                    Object bufferValue = list.get(i).get(value[j]);
                    if (bufferValue instanceof Date) {
                        //获取value
                        valueS = DateUtil.parseData((Date) bufferValue, "yyyy-MM-dd HH:mm:ss");
                    } else {
                        //获取value
                        valueS = StringUtils.isEmpty(bufferValue) ? "" : bufferValue.toString();
                    }
                    //把值放进去
                    cell.setCellValue(valueS);
                    //设置样式
                    cell.setCellStyle(cs);
                }
            }
        }
        return worb;
    }



}
